package negocio.composEstoque;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.Iterator;

import utilidades.FormatarData;
import dominio.composEstoque.CFOP;
import dominio.composEstoque.Cons_Imob;
import dominio.composEstoque.Demonstrativo_Cons_Imob;
import dominio.composEstoque.Demonstrativo_Estoque;
import dominio.composEstoque.Demonstrativo_Vendas;
import dominio.composEstoque.ICMS;
import dominio.composEstoque.Layout;
import dominio.despant.Historico_Despesa_Antecipada;

public class Negocio {

	public static Collection montaDem_Estoque(Collection layout, Collection cfops) {
				
		Collection resultado = new ArrayList();
		Collection<CFOP> cfops_separadas = new ArrayList<CFOP>();
		Iterator res = cfops.iterator();
		Demonstrativo_Estoque dem_estoque;
		
		ArrayList layouts = (ArrayList) layout;

		while (res.hasNext()) {			
			CFOP c = (CFOP) res.next();			
			if (c.getDemonstrativo().toString().equalsIgnoreCase("ESTOQUE")) {
				cfops_separadas.add(c);
			}
		}
		
		Iterator cfops_sep = cfops_separadas.iterator();
		
		while (cfops_sep.hasNext()) {
			CFOP c = (CFOP) cfops_sep.next();			
			for (int i=0;i<layouts.size();i++){
				Layout l = (Layout)layouts.get(i);
				if (l.getCfop().equals(c.getCodigo())) {
					dem_estoque = new Demonstrativo_Estoque();
					dem_estoque.setCodigo(l.getCfop());
					dem_estoque.setData(l.getData());					
					dem_estoque.setTipo(c.getDebito_credito());
					dem_estoque.setValor(l.getValor_contabil());
					try {
						dem_estoque.setPeriodo(FormatarData.getMesAno(FormatarData.formatar(l.getData())));
					} catch (ParseException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					dem_estoque.setIcms(new ICMS("ICMS S/ " + l.getCfop(), l.getValor_icms()));				
					resultado.add(dem_estoque);
				}
			}
		}
		
		return resultado;
		
	}
	
	public static Collection montaDem_Cons(Collection layout, Collection cfops) {
		
		Collection resultado = new ArrayList();
		Collection<CFOP> cfops_separadas = new ArrayList<CFOP>();
		Iterator res = cfops.iterator();
		Demonstrativo_Cons_Imob dem_cons;
		
		ArrayList layouts = (ArrayList) layout;

		while (res.hasNext()) {			
			CFOP c = (CFOP) res.next();			
			if (c.getDemonstrativo().toString().equalsIgnoreCase("CONSUMO")) {
				cfops_separadas.add(c);
			}
		}
		
		Iterator cfops_sep = cfops_separadas.iterator();
		
		while (cfops_sep.hasNext()) {
			CFOP c = (CFOP) cfops_sep.next();
			for (int i=0;i<layouts.size();i++){
				Layout l = (Layout)layouts.get(i);
				if (l.getCfop().equals(c.getCodigo())) {
					dem_cons = new Demonstrativo_Cons_Imob();
					dem_cons.setData(l.getData());
					dem_cons.setNumero_nf(l.getNumero_nf());
					dem_cons.setTipo(Cons_Imob.CONSUMO);
					dem_cons.setValor(l.getValor_contabil());
					resultado.add(dem_cons);
				}
			}
		}
		
		return resultado;
		
	}
	
	public static Collection montaDem_Imob(Collection layout, Collection cfops) {
		
		Collection resultado = new ArrayList();
		Collection<CFOP> cfops_separadas = new ArrayList<CFOP>();
		Iterator res = cfops.iterator();
		Demonstrativo_Cons_Imob dem_imob;
		
		ArrayList layouts = (ArrayList) layout;

		while (res.hasNext()) {			
			CFOP c = (CFOP) res.next();			
			if (c.getDemonstrativo().toString().equalsIgnoreCase("IMOBILIZADO")) {
				cfops_separadas.add(c);
			}
		}
		
		Iterator cfops_sep = cfops_separadas.iterator();
		
		while (cfops_sep.hasNext()) {
			CFOP c = (CFOP) cfops_sep.next();
			for (int i=0;i<layouts.size();i++){
				Layout l = (Layout)layouts.get(i);
				if (l.getCfop().equals(c.getCodigo())) {
					dem_imob = new Demonstrativo_Cons_Imob();
					dem_imob.setData(l.getData());
					dem_imob.setNumero_nf(l.getNumero_nf());
					dem_imob.setTipo(Cons_Imob.IMOBILIZADO);
					dem_imob.setValor(l.getValor_contabil());
					resultado.add(dem_imob);
				}
			}
		}
		
		return resultado;
		
	}
	
	public static Collection montaDem_Vendas(Collection layout, Collection cfops) {
		
		Collection resultado = new ArrayList();
		Collection<CFOP> cfops_separadas = new ArrayList<CFOP>();
		Iterator res = cfops.iterator();
		Demonstrativo_Vendas dem_vendas;
		
		ArrayList layouts = (ArrayList) layout;

		while (res.hasNext()) {			
			CFOP c = (CFOP) res.next();			
			if (c.getDemonstrativo().toString().equalsIgnoreCase("VENDAS")) {
				cfops_separadas.add(c);
			}
		}
		
		Iterator cfops_sep = cfops_separadas.iterator();
		
		while (cfops_sep.hasNext()) {
			CFOP c = (CFOP) cfops_sep.next();
			for (int i=0;i<layouts.size();i++){
				Layout l = (Layout)layouts.get(i);
				if (l.getCfop().equals(c.getCodigo())) {
					dem_vendas = new Demonstrativo_Vendas();
					dem_vendas.setCfop(c);
					dem_vendas.setData(l.getData());
					dem_vendas.setVendas(l.getValor_contabil());
					dem_vendas.setIcms(new ICMS("ICMS S/ " + l.getCfop(), l.getValor_icms()));
					resultado.add(dem_vendas);
				}
			}
		}
		
		return resultado;
		
	}

	public static Collection separaMesesVendas(Collection res, String mesini, String mesfim) {
		
		GregorianCalendar mes_inicial = FormatarData.inserirData(mesini);
		GregorianCalendar mes_final = FormatarData.inserirData(mesfim);
		Collection<Demonstrativo_Vendas> result = new ArrayList<Demonstrativo_Vendas>();	
		
		Iterator vendas = res.iterator();
		
		while(vendas.hasNext()) {
			
			Demonstrativo_Vendas dv = (Demonstrativo_Vendas) vendas.next();
			GregorianCalendar aux = dv.getData();
			
			if (aux.compareTo(mes_inicial) > 0 && aux.compareTo(mes_final) < 0) {
				int mes = aux.get(GregorianCalendar.MONTH);
				result.add(dv);
			}
			else if (aux.compareTo(mes_final) == 0) {
				result.add(dv);
			}
			else if (aux.compareTo(mes_inicial) == 0) {
				result.add(dv);
			}
			
		}
		
		return result;
		
	}

	
	public static Collection ordenaMesesVendas(Collection res) {
		
		ArrayList<Demonstrativo_Vendas> a = (ArrayList) res;
		Collection resultado = new ArrayList();		
		
		for (int i = 0; i < a.size(); i++){
			
			for (int j = 0; j < a.size()-1; j++) {
				
				Demonstrativo_Vendas dv = (Demonstrativo_Vendas) a.get(i);
				GregorianCalendar g = dv.getData();
				Demonstrativo_Vendas dv1 = (Demonstrativo_Vendas) a.get(j);
				GregorianCalendar g1 = dv1.getData();
				
				if (g.compareTo(g1) < 0) {
					
					Demonstrativo_Vendas temp = (Demonstrativo_Vendas) a.get(i);
					a.set(i, a.get(j));
					a.set(j, temp);
					
				}			
			}
		}
		
		resultado = (Collection) a;
		
		return resultado;
	}

	public static Collection ordenaMesesCons_Imob(Collection res) {
		
		ArrayList<Demonstrativo_Cons_Imob> a = (ArrayList) res;
		Collection resultado = new ArrayList();		
		
		for (int i = 0; i < a.size(); i++){
			
			for (int j = 0; j < a.size()-1; j++) {
				
				Demonstrativo_Cons_Imob dv = (Demonstrativo_Cons_Imob) a.get(i);
				GregorianCalendar g = dv.getData();
				Demonstrativo_Cons_Imob dv1 = (Demonstrativo_Cons_Imob) a.get(j);
				GregorianCalendar g1 = dv1.getData();
				
				if (g.compareTo(g1) < 0) {
					
					Demonstrativo_Cons_Imob temp = (Demonstrativo_Cons_Imob) a.get(i);
					a.set(i, a.get(j));
					a.set(j, temp);
					
				}			
			}
		}
		
		resultado = (Collection) a;
		
		return resultado;
	}

	
	public static Collection separaMesesCons_Imob(Collection res, String mesini, String mesfim) {
		
		GregorianCalendar mes_inicial = FormatarData.inserirData(mesini);
		GregorianCalendar mes_final = FormatarData.inserirData(mesfim);
		Collection<Demonstrativo_Cons_Imob> result = new ArrayList<Demonstrativo_Cons_Imob>();	
		
		Iterator cons_imob = res.iterator();
		
		while(cons_imob.hasNext()) {
			
			Demonstrativo_Cons_Imob dv = (Demonstrativo_Cons_Imob) cons_imob.next();
			GregorianCalendar aux = dv.getData();
			
			if (aux.compareTo(mes_inicial) > 0 && aux.compareTo(mes_final) < 0) {
				int mes = aux.get(GregorianCalendar.MONTH);
				result.add(dv);
			}
			else if (aux.compareTo(mes_final) == 0) {
				result.add(dv);
			}
			else if (aux.compareTo(mes_inicial) == 0) {
				result.add(dv);
			}
			
		}
		
		return result;
		
	}

	public static Collection separaMesesEstoque(Collection res, String mesini, String mesfim) {
		
		GregorianCalendar mes_inicial = FormatarData.inserirData(mesini);
		GregorianCalendar mes_final = FormatarData.inserirData(mesfim);
		Collection<Demonstrativo_Estoque> result = new ArrayList<Demonstrativo_Estoque>();	
		
		Iterator cons_imob = res.iterator();
		
		while(cons_imob.hasNext()) {
			
			Demonstrativo_Estoque dv = (Demonstrativo_Estoque) cons_imob.next();
			GregorianCalendar aux = dv.getData();
			
			if (aux.compareTo(mes_inicial) > 0 && aux.compareTo(mes_final) < 0) {
				int mes = aux.get(GregorianCalendar.MONTH);
				result.add(dv);
			}
			else if (aux.compareTo(mes_final) == 0) {
				result.add(dv);
			}
			else if (aux.compareTo(mes_inicial) == 0) {
				result.add(dv);
			}
			
		}
		
		return result;
		
	}

	public static Collection ordenaMesesEstoque(Collection res) {
		
		ArrayList<Demonstrativo_Estoque> a = (ArrayList) res;
		Collection resultado = new ArrayList();		
		
		for (int i = 0; i < a.size(); i++){
			
			for (int j = 0; j < a.size()-1; j++) {
				
				Demonstrativo_Estoque dv = (Demonstrativo_Estoque) a.get(i);
				GregorianCalendar g = dv.getData();
				Demonstrativo_Estoque dv1 = (Demonstrativo_Estoque) a.get(j);
				GregorianCalendar g1 = dv1.getData();
				
				if (g.compareTo(g1) < 0) {
					
					Demonstrativo_Estoque temp = (Demonstrativo_Estoque) a.get(i);
					a.set(i, a.get(j));
					a.set(j, temp);
					
				}			
			}
		}
		
		resultado = (Collection) a;
		
		return resultado;
		
	}

	
	public static void insertICMS(Collection debitos, Collection creditos) {
		
		Iterator credits = creditos.iterator();
		
		while (credits.hasNext()) {
			Demonstrativo_Estoque de = (Demonstrativo_Estoque) credits.next();
			Demonstrativo_Estoque novo = new Demonstrativo_Estoque();
			if (de.getIcms() != null) {				
				if (!de.getIcms().getDescricao().equals("")) {
					novo.setCodigo(de.getIcms().getDescricao());
					novo.setValor(de.getIcms().getValor());
					novo.setData(de.getData());
					novo.setPeriodo(de.getPeriodo());
					debitos.add(novo);
				}
			}		
		}
		
		Iterator debits = debitos.iterator();
		
		while(debits.hasNext()) {
			Demonstrativo_Estoque de = (Demonstrativo_Estoque) debits.next();
			Demonstrativo_Estoque novo = new Demonstrativo_Estoque();
			if (de.getIcms() != null) {
				novo.setCodigo(de.getIcms().getDescricao());
				novo.setValor(de.getIcms().getValor());
				novo.setData(de.getData());
				novo.setPeriodo(de.getPeriodo());
				creditos.add(novo);
			}	
		}
		
	}
	
}
